#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行，
# 第2行注释表示.py文件本身使用标准UTF-8编码；
print('#############访问限制#############')


class Student(object):
    # class后面紧接着是类名，即Student，类名通常是大写开头的单词，紧接着是(object)，表示该类是从哪个类继承下来的，
    # 通常，如果没有合适的继承类，就使用object类，这是所有类最终都会继承的类。
    def __init__(self, name, score):
        # 注意到__init__方法的第一个参数永远是self，表示创建的实例本身，因此，在__init__方法内部，就可以把各种属性绑定到self，
        # 因为self就指向创建的实例本身。
        # 有了__init__方法，在创建实例的时候，就不能传入空的参数了，必须传入与__init__方法匹配的参数，但self不需要传，
        # Python解释器自己会把实例变量传进去：
        self.__name = name  # 使用“__”表示内部属性不能被外部访问
        self.__score = score

    def set_score(self, score):  # 定义一个方法，外部可以修改私有变量，可以进行变量的检查
        if 100 >= score >= 0:
            self.__score = score
        else:
            raise ValueError("bad score")

    def get_score(self):
        return self.__score

    def set_name(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def print_score(self):
        print('%s: %s' % (self.__name, self.__score))

    def get_grade(self):
        if self.score >= 90:
            print('A')
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'


wangyk = Student('wangyk', 99)
wangyk.print_score()
wangyk.set_name("哈哈")
wangyk.print_score()
wangyk.set_score(100)
wangyk.print_score()
# 需要注意的是，在Python中，变量名类似__xxx__的，也就是以双下划线开头，并且以双下划线结尾的，是特殊变量，
# 特殊变量是可以直接访问的，不是private变量，所以，不能用__name__、__score__这样的变量名。
# 有些时候，你会看到以一个下划线开头的实例变量名，比如_name，这样的实例变量外部是可以访问的，但是，按照约定俗成的规定，
# 当你看到这样的变量时，意思就是，“虽然我可以被访问，但是，请把我视为私有变量，不要随意访问”。
# 双下划线开头的实例变量是不是一定不能从外部访问呢？其实也不是。
# 不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name，所以，仍然可以通过_Student__name来访问__name变量
print('#############外部方位变量#############')
print(wangyk._Student__name)
